﻿using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;

namespace MeTalker.Window.SDK.Core
{
    internal class KeysetControl
    {
        internal const int WM_GETTEXT = 0x000D;
        internal const int WM_SETTEXT = 0x000C;
        internal const int WM_CLICK = 0x00F5;
        internal const int WM_KEYDOWN = 256;
        internal const int VK_SPACE = 32;
        internal const int VK_RETURN = 0x0D;
        internal const int WM_KEYUP = 0x0101;
        [DllImport("user32.dll", EntryPoint = "keybd_event")]
        internal static extern void keybd_event(
            byte bVk,
            byte bScan,
            int dwFlags,  //这里是整数类型  0 为按下，2为释放
            int dwExtraInfo  //这里是整数类型 一般情况下设成为 0
        );

        [DllImport("user32.dll ", EntryPoint = "SendMessage")]
        internal static extern int SendMessage(IntPtr hwnd, uint wMsg, int wParam, StringBuilder lParam);

        [DllImport("user32.dll", EntryPoint = "SendMessage")]
        internal static extern int SendMessage(IntPtr hwnd, int wMsg, int wParam, string lParam);

        [DllImport("user32.dll", EntryPoint = "SendMessage")]
        internal static extern int SendMessage(IntPtr hwnd, int wMsg, int wParam, int lParam);

        [DllImport("user32.dll", EntryPoint = "SendMessage")]
        internal static extern int SendMessage(IntPtr hwnd, int wMsg, int wParam, IntPtr lParam);

         // 消息函数
        [DllImport("user32.dll", EntryPoint = "PostMessageA")]
        internal static extern bool PostMessage(IntPtr hWnd, int Msg, int wParam, int lParam);

        internal static void SendMessageText(IntPtr hwnd, string message)
        {
            SendMessage(hwnd, WM_SETTEXT, 0, message);
            //PostMessage(hwnd, WM_KEYDOWN, 32, 0);
        }

        internal static void SendMessage(IntPtr hwnd, string message)
        {
            StringBuilder sb = new StringBuilder();
            sb.Append(message);
            SendMessage(hwnd, WM_SETTEXT, 0, sb);
            //PostMessage(hwnd, WM_KEYDOWN, 32, 0);
        }
        
        //internal static void SendMessage(IntPtr hwnd, string message)
        //{
        //    IntPtr p = Marshal.StringToHGlobalAnsi(message);
        //    SendMessage(hwnd, WM_SETTEXT, 0, p);
        //}

        //internal static void SendMessage(IntPtr hwnd, string message)
        //{
        //    for (int i = 0; i < message.Length; i++)
        //    {
        //        byte[] bt = Encoding.Default.GetBytes(message[i].ToString());
        //        KeysetControl.SendMessage(hwnd, 0x100, 0xE5, 0);
        //        for (int j = 0; j < bt.Length; j++)
        //        {
        //            KeysetControl.SendMessage(hwnd, 0x102, bt[j], 0);
        //        }
        //    }
        //}
    }
}

 

/*
    函数功能：该函数将指定的消息发送到一个或多个窗口。此函数为指定的窗口调用窗口程序，直到窗口程序处理完消息再返回。而函数PostMessage不同，将一个消息寄送到一个线程的消息队列后立即返回。
　　函数原型：LRESULT SendMessage（HWND hWnd，UINT Msg，WPARAM wParam，LPARAM IParam）；
　　参数：
　　hWnd：其窗口程序将接收消息的窗口的句柄。如果此参数为HWND_BROADCAST，则消息将被发送到系统中所有顶层窗口，包括无效或不可见的非自身拥有的窗口、被覆盖的窗口和弹出式窗口，但消息不被发送到子窗口。
　　Msg：指定被发送的消息。
　　wParam：指定附加的消息指定信息。
　　IParam：指定附加的消息指定信息。
　　返回值：返回值指定消息处理的结果，依赖于所发送的消息。
　　备注：需要用HWND_BROADCAST通信的应用程序应当使用函数RegisterWindowMessage来为应用程序间的通信取得一个唯一的消息。  
 * */
